package fr.lip6.move.care

import sdmakerz_v1.coresyntax.generator.interfaces.IContext
import sdmakerz_v1.coresyntax.sDMakerV1.Loop
import sdmakerz_v1.coresyntax.generator.interfaces.IConfigData
import sdmakerz_v1.coresyntax.generator.SDMakerV1IDProvider

class CareLoopGen {
	private CareGen mainGenerator;
	
	new(CareGen mainGenerator){
		this.mainGenerator= mainGenerator;
	}
	
	def public
	CompileResult compile(IContext context, Loop loop){
		
    var IConfigData config= context.getConfigData
    var java.util.ArrayList<CompileResult> nestedResults=
    	 new java.util.ArrayList<CompileResult>();
    var java.util.ArrayList<String> nestedEltIDs= 
    	 new java.util.ArrayList<String>();
    var CompileResult compRes
    var loopID= "loop_id"+SDMakerV1IDProvider::computeID
    var double probContinue= -1;
    
    if((loop.probContinue != null) &&
       	0 < loop.probContinue.value &&
       	    loop.probContinue.value <= 1 ){
       			   	
       	probContinue= loop.probContinue.value;
    }
    else{
       	probContinue= config.probContinueLoop;
    }
    
    var CharSequence charSequenceResult=
    '''	
    
    «FOR elt: loop.body»
    «SDMakerToCareUtils::toNullExp(compRes= mainGenerator.compile(context, elt))»
    «SDMakerToCareUtils::toNullExp(nestedResults.add(compRes))»
    «SDMakerToCareUtils::toNullExp(nestedEltIDs.add(compRes.eltID))»
    «ENDFOR»
    	
   	«IF nestedEltIDs.size == 1»
    /* LOOP: «loopID» */
     «nestedResults.get(0).charSequenceResult»
    «IF 0 < probContinue && probContinue <= 1 »
    Loop «loopID» = new Loop(«nestedEltIDs.get(0)», «probContinue»);
    «ELSE»
    Loop «loopID» = new Loop(«nestedEltIDs.get(0)»);
    «ENDIF»
    «ELSEIF nestedEltIDs.size > 1»
    /* LOOP: «loopID» */
    BlockList bloc_«loopID» = new BlockList();
    «FOR nestedResult: nestedResults»
    	«nestedResult.charSequenceResult»
    «ENDFOR»
    
    //add(s) for «loopID»
    «FOR eltID: nestedEltIDs»
    bloc_«loopID».add(«eltID»);
    «ENDFOR»
    
    /* FINALIZING «loopID» */
    «IF 0 < probContinue && probContinue <= 1 »
    Loop «loopID» = new Loop(bloc_«loopID», «probContinue»);
    «ELSE»
     Loop «loopID» = new Loop(bloc_«loopID»);
    «ENDIF»
    «ENDIF»
    '''
      
//    var Diagram theD= (DiagramSDMakerUtils::findContainer(loop, typeof(Diagram));
//    SDMakerUtils::foundDiagram(loop);
    return new CompileResult(
    				charSequenceResult,
    				loopID,
    				true)
	}
}